Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid flash of background color when scrolling in safari #32747

Merged
merged 1 commit into from
Jun 23, 2021

Conversation

gwwar
Copy link
Contributor

@gwwar gwwar commented Jun 16, 2021

In Safari when we scroll we can see a flash of background color that's set on .edit-post-layout .interface-interface-skeleton__content. I set it to pink in the before video to make this more apparent. This background color is intended to be used while in device preview/template mode.

Changes in this PR move this background color rule to a different div that is not a compositing layer. It looks like there may be a Safari browser bug around ordering (or general slowness) with mixing hardware accelerated elements and non-accelerated elements.

This fix targets the background flashing behavior only in Safari. There's a separate exploratory PR to remove the text flashing issues in #32824

Extra Debugging Notes:

  • --webkit-overflow-scrolling:touch is added by default in Safari when there’s a scroll area, such as (overflow:scroll or overflow:auto)
  • We cannot unset --webkit-overflow-scrolling 😭. (This is shown as an invalid property in dev tools, but will still show up as a compositing reason in the layers tab).
  • --webkit-overflow-scrolling:touch is a compositing reason. It creates a new layer to be sent off to the GPU to render. This is fine, but when this layer gets too large(and likely hits GPU memory limits, we see glitches like incorrect ordering of elements.)
  • With the same content and code, we can trigger or not trigger these glitches based on how large the compositing layer is. For example by resizing the browser window smaller, or changing the font size.

Before:

beforeinpink.mp4

After:

noflash.mp4

Testing Instructions

  • In trunk+Safari verify that the grey/black flashing appears when scrolling. It's easier to trigger this with a post with gallery content.
  • In this branch verify that the flashing no longer occurs. No regressions when modifying templates or previewing with tablet or mobile.

@gwwar gwwar requested review from getdave and jasmussen June 16, 2021 18:52
@gwwar gwwar self-assigned this Jun 16, 2021
@github-actions
Copy link

github-actions bot commented Jun 16, 2021

Size Change: -12 B (0%)

Total Size: 1.04 MB

Filename Size Change
build/edit-post/style-rtl.css 7.04 kB -7 B (0%)
build/edit-post/style.css 7.03 kB -5 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.min.js 1.12 kB 0 B
build/annotations/index.min.js 2.93 kB 0 B
build/api-fetch/index.min.js 2.44 kB 0 B
build/autop/index.min.js 2.28 kB 0 B
build/blob/index.min.js 672 B 0 B
build/block-directory/index.min.js 6.61 kB 0 B
build/block-directory/style-rtl.css 989 B 0 B
build/block-directory/style.css 990 B 0 B
build/block-editor/index.min.js 119 kB 0 B
build/block-editor/style-rtl.css 13.5 kB 0 B
build/block-editor/style.css 13.5 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/archives/style-rtl.css 65 B 0 B
build/block-library/blocks/archives/style.css 65 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 112 B 0 B
build/block-library/blocks/audio/style.css 112 B 0 B
build/block-library/blocks/audio/theme-rtl.css 125 B 0 B
build/block-library/blocks/audio/theme.css 125 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/button/style-rtl.css 603 B 0 B
build/block-library/blocks/button/style.css 602 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 315 B 0 B
build/block-library/blocks/buttons/editor.css 315 B 0 B
build/block-library/blocks/buttons/style-rtl.css 375 B 0 B
build/block-library/blocks/buttons/style.css 375 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/code/theme-rtl.css 131 B 0 B
build/block-library/blocks/code/theme.css 131 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 422 B 0 B
build/block-library/blocks/columns/style.css 422 B 0 B
build/block-library/blocks/cover/editor-rtl.css 644 B 0 B
build/block-library/blocks/cover/editor.css 646 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB 0 B
build/block-library/blocks/cover/style.css 1.23 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 401 B 0 B
build/block-library/blocks/embed/style.css 400 B 0 B
build/block-library/blocks/embed/theme-rtl.css 124 B 0 B
build/block-library/blocks/embed/theme.css 124 B 0 B
build/block-library/blocks/file/editor-rtl.css 301 B 0 B
build/block-library/blocks/file/editor.css 300 B 0 B
build/block-library/blocks/file/style-rtl.css 255 B 0 B
build/block-library/blocks/file/style.css 255 B 0 B
build/block-library/blocks/file/view.min.js 780 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB 0 B
build/block-library/blocks/freeform/editor.css 2.44 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 704 B 0 B
build/block-library/blocks/gallery/editor.css 705 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.06 kB 0 B
build/block-library/blocks/gallery/style.css 1.06 kB 0 B
build/block-library/blocks/gallery/theme-rtl.css 122 B 0 B
build/block-library/blocks/gallery/theme.css 122 B 0 B
build/block-library/blocks/group/editor-rtl.css 160 B 0 B
build/block-library/blocks/group/editor.css 160 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/group/theme-rtl.css 93 B 0 B
build/block-library/blocks/group/theme.css 93 B 0 B
build/block-library/blocks/heading/editor-rtl.css 152 B 0 B
build/block-library/blocks/heading/editor.css 152 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/home-link/style-rtl.css 259 B 0 B
build/block-library/blocks/home-link/style.css 259 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 729 B 0 B
build/block-library/blocks/image/editor.css 727 B 0 B
build/block-library/blocks/image/style-rtl.css 481 B 0 B
build/block-library/blocks/image/style.css 485 B 0 B
build/block-library/blocks/image/theme-rtl.css 124 B 0 B
build/block-library/blocks/image/theme.css 124 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 281 B 0 B
build/block-library/blocks/latest-comments/style.css 282 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 529 B 0 B
build/block-library/blocks/latest-posts/style.css 529 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 176 B 0 B
build/block-library/blocks/media-text/editor.css 176 B 0 B
build/block-library/blocks/media-text/style-rtl.css 492 B 0 B
build/block-library/blocks/media-text/style.css 489 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 633 B 0 B
build/block-library/blocks/navigation-link/editor.css 634 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B 0 B
build/block-library/blocks/navigation-link/style.css 94 B 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.55 kB 0 B
build/block-library/blocks/navigation/editor.css 1.55 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 1.63 kB 0 B
build/block-library/blocks/navigation/style.css 1.63 kB 0 B
build/block-library/blocks/navigation/view.min.js 2.87 kB 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 310 B 0 B
build/block-library/blocks/page-list/editor.css 311 B 0 B
build/block-library/blocks/page-list/style-rtl.css 240 B 0 B
build/block-library/blocks/page-list/style.css 240 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B 0 B
build/block-library/blocks/paragraph/editor.css 157 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 247 B 0 B
build/block-library/blocks/paragraph/style.css 248 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B 0 B
build/block-library/blocks/post-comments-form/style.css 140 B 0 B
build/block-library/blocks/post-comments/style-rtl.css 360 B 0 B
build/block-library/blocks/post-comments/style.css 359 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B 0 B
build/block-library/blocks/post-excerpt/style.css 69 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 141 B 0 B
build/block-library/blocks/post-featured-image/style.css 141 B 0 B
build/block-library/blocks/post-template/editor-rtl.css 100 B 0 B
build/block-library/blocks/post-template/editor.css 99 B 0 B
build/block-library/blocks/post-template/style-rtl.css 379 B 0 B
build/block-library/blocks/post-template/style.css 380 B 0 B
build/block-library/blocks/post-title/style-rtl.css 60 B 0 B
build/block-library/blocks/post-title/style.css 60 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 103 B 0 B
build/block-library/blocks/preformatted/style.css 103 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 318 B 0 B
build/block-library/blocks/pullquote/style.css 318 B 0 B
build/block-library/blocks/pullquote/theme-rtl.css 169 B 0 B
build/block-library/blocks/pullquote/theme.css 169 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query-title/editor-rtl.css 86 B 0 B
build/block-library/blocks/query-title/editor.css 86 B 0 B
build/block-library/blocks/query/editor-rtl.css 131 B 0 B
build/block-library/blocks/query/editor.css 132 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/quote/theme-rtl.css 221 B 0 B
build/block-library/blocks/quote/theme.css 221 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 211 B 0 B
build/block-library/blocks/search/editor.css 211 B 0 B
build/block-library/blocks/search/style-rtl.css 359 B 0 B
build/block-library/blocks/search/style.css 362 B 0 B
build/block-library/blocks/search/theme-rtl.css 64 B 0 B
build/block-library/blocks/search/theme.css 64 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 251 B 0 B
build/block-library/blocks/separator/style.css 251 B 0 B
build/block-library/blocks/separator/theme-rtl.css 172 B 0 B
build/block-library/blocks/separator/theme.css 172 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 512 B 0 B
build/block-library/blocks/shortcode/editor.css 512 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 440 B 0 B
build/block-library/blocks/site-logo/editor.css 441 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 154 B 0 B
build/block-library/blocks/site-logo/style.css 154 B 0 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B 0 B
build/block-library/blocks/site-tagline/editor.css 87 B 0 B
build/block-library/blocks/site-title/editor-rtl.css 85 B 0 B
build/block-library/blocks/site-title/editor.css 85 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 800 B 0 B
build/block-library/blocks/social-links/editor.css 799 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.34 kB 0 B
build/block-library/blocks/social-links/style.css 1.34 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 308 B 0 B
build/block-library/blocks/spacer/editor.css 308 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/table/editor-rtl.css 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 480 B 0 B
build/block-library/blocks/table/style.css 480 B 0 B
build/block-library/blocks/table/theme-rtl.css 188 B 0 B
build/block-library/blocks/table/theme.css 188 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 551 B 0 B
build/block-library/blocks/template-part/editor.css 550 B 0 B
build/block-library/blocks/template-part/theme-rtl.css 101 B 0 B
build/block-library/blocks/template-part/theme.css 101 B 0 B
build/block-library/blocks/term-description/editor-rtl.css 90 B 0 B
build/block-library/blocks/term-description/editor.css 90 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 569 B 0 B
build/block-library/blocks/video/editor.css 570 B 0 B
build/block-library/blocks/video/style-rtl.css 173 B 0 B
build/block-library/blocks/video/style.css 173 B 0 B
build/block-library/blocks/video/theme-rtl.css 124 B 0 B
build/block-library/blocks/video/theme.css 124 B 0 B
build/block-library/common-rtl.css 1.26 kB 0 B
build/block-library/common.css 1.26 kB 0 B
build/block-library/editor-rtl.css 9.69 kB 0 B
build/block-library/editor.css 9.69 kB 0 B
build/block-library/index.min.js 145 kB 0 B
build/block-library/reset-rtl.css 514 B 0 B
build/block-library/reset.css 515 B 0 B
build/block-library/style-rtl.css 10.2 kB 0 B
build/block-library/style.css 10.2 kB 0 B
build/block-library/theme-rtl.css 692 B 0 B
build/block-library/theme.css 693 B 0 B
build/block-serialization-default-parser/index.min.js 1.3 kB 0 B
build/block-serialization-spec-parser/index.min.js 3.06 kB 0 B
build/blocks/index.min.js 47.3 kB 0 B
build/components/index.min.js 180 kB 0 B
build/components/style-rtl.css 16.2 kB 0 B
build/components/style.css 16.2 kB 0 B
build/compose/index.min.js 10.2 kB 0 B
build/core-data/index.min.js 12.2 kB 0 B
build/customize-widgets/index.min.js 9.98 kB 0 B
build/customize-widgets/style-rtl.css 1.45 kB 0 B
build/customize-widgets/style.css 1.45 kB 0 B
build/data-controls/index.min.js 827 B 0 B
build/data/index.min.js 7.22 kB 0 B
build/date/index.min.js 31.8 kB 0 B
build/deprecated/index.min.js 738 B 0 B
build/dom-ready/index.min.js 577 B 0 B
build/dom/index.min.js 4.62 kB 0 B
build/edit-navigation/index.min.js 14 kB 0 B
build/edit-navigation/style-rtl.css 3.09 kB 0 B
build/edit-navigation/style.css 3.09 kB 0 B
build/edit-post/classic-rtl.css 454 B 0 B
build/edit-post/classic.css 454 B 0 B
build/edit-post/index.min.js 58.7 kB 0 B
build/edit-site/index.min.js 26 kB 0 B
build/edit-site/style-rtl.css 4.76 kB 0 B
build/edit-site/style.css 4.75 kB 0 B
build/edit-widgets/index.min.js 16 kB 0 B
build/edit-widgets/style-rtl.css 3.5 kB 0 B
build/edit-widgets/style.css 3.5 kB 0 B
build/editor/index.min.js 38.6 kB 0 B
build/editor/style-rtl.css 3.91 kB 0 B
build/editor/style.css 3.9 kB 0 B
build/element/index.min.js 3.44 kB 0 B
build/escape-html/index.min.js 739 B 0 B
build/format-library/index.min.js 5.68 kB 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/hooks/index.min.js 1.76 kB 0 B
build/html-entities/index.min.js 629 B 0 B
build/i18n/index.min.js 3.73 kB 0 B
build/is-shallow-equal/index.min.js 709 B 0 B
build/keyboard-shortcuts/index.min.js 1.74 kB 0 B
build/keycodes/index.min.js 1.43 kB 0 B
build/list-reusable-blocks/index.min.js 2.07 kB 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/media-utils/index.min.js 3.08 kB 0 B
build/notices/index.min.js 1.07 kB 0 B
build/nux/index.min.js 2.31 kB 0 B
build/nux/style-rtl.css 718 B 0 B
build/nux/style.css 716 B 0 B
build/plugins/index.min.js 1.99 kB 0 B
build/primitives/index.min.js 1.03 kB 0 B
build/priority-queue/index.min.js 791 B 0 B
build/react-i18n/index.min.js 925 B 0 B
build/redux-routine/index.min.js 2.82 kB 0 B
build/reusable-blocks/index.min.js 2.56 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/rich-text/index.min.js 10.6 kB 0 B
build/server-side-render/index.min.js 1.63 kB 0 B
build/shortcode/index.min.js 1.68 kB 0 B
build/token-list/index.min.js 848 B 0 B
build/url/index.min.js 1.95 kB 0 B
build/viewport/index.min.js 1.28 kB 0 B
build/warning/index.min.js 1.13 kB 0 B
build/widgets/index.min.js 6.21 kB 0 B
build/widgets/style-rtl.css 722 B 0 B
build/widgets/style.css 722 B 0 B
build/wordcount/index.min.js 1.24 kB 0 B

compressed-size-action

@jasmussen
Copy link
Contributor

Thank you for so patiently improving the Safari experience. It will make a lot of people happy.

In this case, I do appreciate seeing a white flash rather than the very dark flash present before. However it's still a bit of a bandaid, and introduces some other issues:

saf

  • Note how in tablet and mobile previews I see some white at the bottom of long pages, the dark color now not spanning to the end.
  • Note how when editing templates, there are two scrollbars, one for the content, one in the dark canvas.

I suspect to land this we'll want to compare exactly which bits scroll and how, to make sure that's 1:1 — I know that's something Jay spent a lot of time getting just right.

@gwwar
Copy link
Contributor Author

gwwar commented Jun 16, 2021

I noticed this while testing another PR, but in trunk with the same content, we see the background color flashing only in some themes. For example Armando vs Twenty Fourteen. Let me see if I can isolate that

armando.mp4
2014.mp4

@gwwar
Copy link
Contributor Author

gwwar commented Jun 16, 2021

Apparently changing the font-size is enough to do it?

fontsize.mp4

So I tested this out at various font-sizes, and mapped where the background flash doesn't appear. The one thing I did notice is that the compositing layer for block-editor-block-list__layout increases in size as font-size changes:

compositing layer size No scrolling defects
968px x 3799px
967px x 2010px
967px x 1761px
967px x 1600px
967px x 710px

To see compositing layers, click on the layers tab in safari devtools:

Screen Shot 2021-06-16 at 2 39 16 PM

@gwwar
Copy link
Contributor Author

gwwar commented Jun 16, 2021

Nice, I created a base case outside of Gutenberg see https://gist.github.com/gwwar/4d674b0ef9618fd0a5df0e25db969b19

I'll try whittling that down further but we can see what happens when the compositing layer is too large, we'll get a pink background bleed:

scroll-bleed.mp4

This doesn't happen when the compositing layer is smaller (say we decrease the font-size):

scrolling.mp4

@getdave
Copy link
Contributor

getdave commented Jun 17, 2021

I couldn't seem to manage to replicate this on my laptop screen.

One thing I recall from back in the day was that something like transform: translate3d(0,0,0) would trigger the GPU engine and improve rendering of complex layers by moving then onto a separate "plane" or something.

https://davidwalsh.name/translate3d

Not sure if that works as I can't replicate but worth considering?

@jasmussen
Copy link
Contributor

This is wild. I'm going to dig in deeply on this and see what I can learn, if anything.

One thing I recall from back in the day was that something like transform: translate3d(0,0,0) would trigger the GPU engine and improve rendering of complex layers by moving then onto a separate "plane" or something.

Thanks for looking, yes — translate hacks also including translateZ(0) and even will-change: transform; mostly fixes the issue. We have that as a plan B fix in #32575. The reason it's a plan B is that we haven't yet been sure why the flickering happened, meaning it could potentially point to some deeper issues, perhaps even browser issues. But yeah if we don't solve it, we'll have to do that.

@jasmussen
Copy link
Contributor

I'm super impressed that you managed to isolate this. But I'm afraid I can't replicate the tearing:

Screen.Recording.2021-06-17.at.11.01.05.mov

This is Safari 14.1.1 on an iMac. I'll try on a laptop now, but it seems regardless of font size or otherwise, I can't see it.

But let's say you've isolated it, and it's related to compositing layer size — where do we go from there? As best I can get the next step is a webkit bug report and potentially #32575 as a bandaid?

@jasmussen
Copy link
Contributor

I tested on my macbook, and for the briefest moment I was able to see the flash of pink. It was only once, and it happened ever so briefly when scrolling past an image, but notably also scrolling down the page to where I hadn't been before. That last bit could be a coincidence, but mentioning in case there's some off-screen caching going on.

@gwwar
Copy link
Contributor Author

gwwar commented Jun 17, 2021

I tested on my macbook, and for the briefest moment I was able to see the flash of pink.

If y'all check the layers tab what we're interested in is the content div layer getting larger in area. I suspect the trigger point is going to be different for different machines and what GPU they have.

I'll see if I can try and force the compositing layer to be larger in the test case. This is also possible locally by using a monitor with a high resolution and maximizing the page.

@jasmussen
Copy link
Contributor

Do memory/gpu throttling tools exist that we could leverage?

@gwwar
Copy link
Contributor Author

gwwar commented Jun 17, 2021

🤔 I'm not sure there are tools to simulate reduced GPU memory. I think I can come up with a test case using a bunch of large rectangles that should probably do it.

The overflow:auto is adding --webit-overflow-scroll:touch which gives us a compositing layer reason. It overall seems a bit odd to me as a safari browser default since that's likely to hit memory issues with enough content in the pane.

@gwwar
Copy link
Contributor Author

gwwar commented Jun 17, 2021

Ooh while refining the test case I think I uncovered something else. Ideally the compositing layer should only be the size of the scrollable pane. For example, just the visible bits we see in red:

However in Gutenberg, there are other compositing layers that intersect, which might explain how this content layer got so large. I'll try to replicate this in the test base case.

Screen Shot 2021-06-17 at 9 40 14 AM

@gwwar
Copy link
Contributor Author

gwwar commented Jun 18, 2021

For the compositing layer size tangent I went ahead and wrote up my findings here:

#32824

@gwwar gwwar force-pushed the try/safari-scrolling-background-color branch from 08a2bcb to febc370 Compare June 22, 2021 21:07
@gwwar
Copy link
Contributor Author

gwwar commented Jun 22, 2021

I've updated the approach to move the background color to a different div that isn't a compositing layer. So this is ready for another round of reviews.

Note this fixes the background flashing only, I plan on fixing the flickering text in #32824

@jasmussen
Copy link
Contributor

jasmussen commented Jun 23, 2021

I took this for a spin. The "tearing" of the background seems very much fixed for me, very nice! As seen in the GIF there's still the flickering with the fixed position block toolbar, but you're aware of that (#32824).

hey

Copy link
Contributor

@jasmussen jasmussen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This works well for me, fixes the tearing, still shows the dark gray background in preview and template editing modes, and is a mighty fine small fix. It would be nice with a small look by @ellatrix if she has time, otherwise let's land this. Very nice work!

@mtias mtias added the Browser Issues Issues or PRs that are related to browser specific problems label Jun 23, 2021
@gwwar
Copy link
Contributor Author

gwwar commented Jun 23, 2021

Looks like Android E2Es are also broken in trunk from "adb: no devices/emulators found", so the red run there is unrelated to this change.

@jasmussen
Copy link
Contributor

In unrelated testing today I noticed a dark scroll bar in the main canvas in Firefox, in trunk. I believe this PR might fix that as well.

@gwwar
Copy link
Contributor Author

gwwar commented Jun 23, 2021

I'll merge once I can get the other E2Es green. Will try rebasing with trunk

@gwwar gwwar force-pushed the try/safari-scrolling-background-color branch from febc370 to d939812 Compare June 23, 2021 15:19
@gwwar gwwar merged commit 082a21b into trunk Jun 23, 2021
@gwwar gwwar deleted the try/safari-scrolling-background-color branch June 23, 2021 16:06
@gwwar
Copy link
Contributor Author

gwwar commented Jun 23, 2021

Thanks for the reviews @jasmussen @getdave !

@youknowriad
Copy link
Contributor

Is this something we want to include in WP 5.8?

@gwwar
Copy link
Contributor Author

gwwar commented Jun 23, 2021

Is this something we want to include in WP 5.8?

@youknowriad Sure, if the the window is still open for that 👍 I think this should be relatively safe to try.

@youknowriad youknowriad added the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jun 23, 2021
@jasmussen
Copy link
Contributor

To expand on what but I think this also fixed, here's what I saw in Firefox before:

ff before

Here's after:

Screenshot 2021-06-24 at 09 02 05

@youknowriad youknowriad removed the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jun 24, 2021
youknowriad pushed a commit that referenced this pull request Jun 24, 2021
youknowriad pushed a commit that referenced this pull request Jun 24, 2021
@gwwar
Copy link
Contributor Author

gwwar commented Jun 30, 2021

I've filed a bug in webkit https://bugs.webkit.org/show_bug.cgi?id=227532 and added a much smaller test case here. I think there's a combination of needing a fast repaint rate (which is easier to trigger with a mousewheel) plus a large compositing layer to slow down the speed of repaints.

https://codepen.io/gwwar/pen/BaRawoz or https://gist.github.com/gwwar/0bbe359ea9830cb959774f6ee6e94b75

It should look like this if folks manage to trigger the glitch:

scrolling.mp4

If folks have trouble seeing the pink, try triggering a lot of scrolls in dev console like:

for ( i =0; i<100000; i++) { document.querySelector('.scrollable').scroll( { top: i } ); }

And then trigger a scroll from the user (via touchpad or mouse).

devconsole.mp4

@gwwar
Copy link
Contributor Author

gwwar commented Jun 30, 2021

I also isolated the scrollbar drawing that layer instead of drawing the scrollbar control in:
https://codepen.io/gwwar/pen/VwbYgmR

It should look like this with the bug:

scrollbarcolor.mp4

I'll file a WebKit bug once I get some +1s that this also triggers for other folks. Verified by others 👍

This one also requires scrollbars to be shown:

scrolltoalways.mp4

Filed this one to: https://bugs.webkit.org/show_bug.cgi?id=227545

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Browser Issues Issues or PRs that are related to browser specific problems
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants